package com.example.cloudprinter.api.yilianyun;

import com.example.cloudprinter.entity.yilianyun.AccessTokenResponse;
import com.example.cloudprinter.entity.yilianyun.AddPrinterResponse;
import com.example.cloudprinter.entity.yilianyun.DeletePrinterResponse;
import com.example.cloudprinter.entity.yilianyun.PrintResponse;
import com.example.cloudprinter.entity.yilianyun.QrAuthResponse;
import com.example.cloudprinter.entity.yilianyun.SetSoundResponse;

import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Observable;

/**
 * 外卖管家打印机访问接口
 */
public interface YilianYunPrinterApi {

    /**
     * 授权并获取Token
     *
     * @param client_id  应用id（去易联云官网申请）
     * @param grant_type 授与方式（固定为'client_credentials'）
     * @param sign       签名
     * @param scope      授权权限，传all
     * @param timestamp  时间戳
     * @param id         uuid
     * @return
     */
    @POST("oauth/oauth")
    @FormUrlEncoded
    Observable<AccessTokenResponse> getToken(@Field("client_id") String client_id,
                                             @Field("grant_type") String grant_type,
                                             @Field("sign") String sign,
                                             @Field("scope") String scope,
                                             @Field("timestamp") String timestamp,
                                             @Field("id") String id);

    /**
     * 刷新access_token
     *
     * @param client_id     应用id
     * @param grant_type    授与方式（固定为 “refresh_token”）
     * @param scope         授权权限，传all
     * @param sign          签名
     * @param refresh_token
     * @param id            uuid
     * @param timestamp     时间戳
     * @return
     */
    @POST("oauth/oauth")
    @FormUrlEncoded
    Observable<AccessTokenResponse> refreshToken(@Field("client_id") String client_id,
                                                 @Field("grant_type") String grant_type,
                                                 @Field("scope") String scope,
                                                 @Field("sign") String sign,
                                                 @Field("refresh_token") String refresh_token,
                                                 @Field("id") String id,
                                                 @Field("timestamp") String timestamp);

    /**
     * 添加打印机
     *
     * @param client_id
     * @param machine_code 打印机终端号
     * @param msign        打印机密钥
     * @param access_token
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("printer/addprinter")
    @FormUrlEncoded
    Observable<AddPrinterResponse> addPrinter(@Field("client_id") String client_id,
                                              @Field("machine_code") String machine_code,
                                              @Field("msign") String msign,
                                              @Field("access_token") String access_token,
                                              @Field("sign") String sign,
                                              @Field("id") String id,
                                              @Field("timestamp") String timestamp);


    /**
     * 扫描二维码快速授权打印机
     *
     * @param client_id
     * @param machine_code 打印机终端编号
     * @param qr_key       二维码图解析出来的特殊密钥
     * @param scope
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("oauth/scancodemodel")
    @FormUrlEncoded
    Observable<QrAuthResponse> qrAuth(@Field("client_id") String client_id,
                                      @Field("machine_code") String machine_code,
                                      @Field("qr_key") String qr_key,
                                      @Field("scope") String scope,
                                      @Field("sign") String sign,
                                      @Field("id") String id,
                                      @Field("timestamp") String timestamp);

    /**
     * 删除打印机
     *
     * @param client_id
     * @param machine_code 打印机终端编号
     * @param access_token
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("printer/deleteprinter")
    @FormUrlEncoded
    Observable<DeletePrinterResponse> deletePrinter(@Field("client_id") String client_id,
                                                    @Field("machine_code") String machine_code,
                                                    @Field("access_token") String access_token,
                                                    @Field("sign") String sign,
                                                    @Field("id") String id,
                                                    @Field("timestamp") String timestamp);

    /**
     * 设置语音播报
     *
     * @param client_id
     * @param access_token
     * @param machine_code 打印机终端编号
     * @param content      播报内容 , 音量(1~9) , 声音类型(0,1,3,4) 组成json ! 示例 ["测试",9,0] 或者是在线语音链接! 语音内容请小于24kb
     * @param is_file      true or false , 判断content是否为在线语音链接
     * @param aid          0~9 , 定义需设置的语音编号,若不提交,默认升序
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("printer/setvoice")
    @FormUrlEncoded
    Observable<SetSoundResponse> setVoice(@Field("client_id") String client_id,
                                          @Field("access_token") String access_token,
                                          @Field("machine_code") String machine_code,
                                          @Field("content") String content,
                                          @Field("is_file") boolean is_file,
                                          @Field("aid") int aid,
                                          @Field("sign") String sign,
                                          @Field("id") String id,
                                          @Field("timestamp") String timestamp);

    /**
     * 打印
     *
     * @param client_id
     * @param access_token
     * @param machine_code 打印机终端编号
     * @param content      打印内容(需要urlencode)
     * @param origin_id    商户系统内部订单号，要求32个字符内，只能是数字、大小写字母
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("print/index")
    @FormUrlEncoded
    Observable<PrintResponse> print(@Field("client_id") String client_id,
                                    @Field("access_token") String access_token,
                                    @Field("machine_code") String machine_code,
                                    @Field("content") String content,
                                    @Field("origin_id") String origin_id,
                                    @Field("sign") String sign,
                                    @Field("id") String id,
                                    @Field("timestamp") String timestamp);

    /**
     * 设置音量
     *
     * @param client_id
     * @param access_token
     * @param machine_code  打印机终端设备
     * @param response_type 蜂鸣器:buzzer,喇叭:horn
     * @param voice         [1,2,3] 3种音量设置
     * @param sign
     * @param id
     * @param timestamp
     * @return
     */
    @POST("printer/setsound")
    @FormUrlEncoded
    Observable<SetSoundResponse> setSound(@Field("client_id") String client_id,
                                          @Field("access_token") String access_token,
                                          @Field("machine_code") String machine_code,
                                          @Field("response_type") String response_type,
                                          @Field("voice") String voice,
                                          @Field("sign") String sign,
                                          @Field("id") String id,
                                          @Field("timestamp") String timestamp);
}


